Procedures can be defined both in classes as operations, or messages, and in blocks, or inside other procedures. In both cases they have the semantics of abstracting an action. Procedures that return a value are sometimes referred to as Functions (rather than plain procedures) to make the distinction clear. Functions return the (last) value that has been assigned to it in its body. Function names are in effect write-only variables.
Parameter types are checked according to the following rules: